<?php

namespace JsonLowCode\Traits;


use JsonLowCode\Helps\Random;

trait BaseEvents
{
    /**
     * @param string $onKey prop的 属性事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function events(string $onKey, string $method = "", string $event = ""): static
    {
        if ($event){
            if (empty($method)){
                $method = "_event_".Random::alpha(12);
            }
            $pattern = '/function\s*\([a-zA-Z0-9_,\s]*\)\s*{/';
            if (preg_match($pattern, $event)){
                $this->setMethods($method, $event, $this->getCacheKey());
            }else{
                $this->setMethods($method, scriptFunc($event), $this->getCacheKey());
            }
        }
        return $this->vOn($onKey, "this.".$method, true);
    }

    /**
     * 元素单击事件
     * @param string $method method的方法名
     * @param string $event method的事件体 ()=>{},function(){}
     * @return $this
     */
    public function onClick(string $event = "", string $method = ""): static
    {
        return $this->events("onClick", $method, $event);
    }

    /**
     * 元素双击事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onDblclick(string $event = "", string $method = ""): static
    {
        return $this->events("onDblclick",$method,$event);
    }

    /**
     * 元素鼠标指针按下事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMousedown(string $event = "", string $method = ""): static
    {
        return $this->events("onMousedown",$method, $event);
    }

    /**
     * 元素鼠标指针抬起事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMouseup(string $event = "", string $method = ""): static
    {
        return $this->events("onMouseup",$method,$event);
    }

    /**
     * 元素鼠标指针移动事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMousemove(string $event = "", string $method = ""): static
    {
        return $this->events("onMousemove",$method,$event);
    }

    /**
     * 元素鼠标指针移进事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMouseenter(string $event = "", string $method = ""): static
    {
        return $this->events("onMouseenter",$method,$event);
    }

    /**
     * 元素鼠标指针移出事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMouseout(string $event = "", string $method = ""): static
    {
        return $this->events("onMouseout",$method,$event);
    }

    /**
     * 元素鼠标指针离开时事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMouseleave(string $event = "", string $method = ""): static
    {
        return $this->events("onMouseleave",$method,$event);
    }

    /**
     * 元素鼠标指针位于元素上方时事件
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onMouseover(string $event = "", string $method = ""): static
    {
        return $this->events("onMouseover",$method,$event);
    }

    /**
     * 元素鼠标右键
     * @param string $method method的方法名
     * @param string $event method的事件体
     * @return $this
     */
    public function onContextmenu(string $event = "", string $method = ""): static
    {
        return $this->events("onContextmenu",$method,$event);
    }


}
